using OrchardCore.FileStorage;
using OrchardCore.FileStorage.FileSystem;
using System.Diagnostics.CodeAnalysis;

namespace Ruitu.Edu.TrainingDemo.Services;

/// <summary>
/// 自定义文件存储服务 - 演示如何创建自定义文件存储实现
/// 
/// 主要用途：
/// - 演示如何继承 FileSystemStore 创建自定义文件存储
/// - 展示文件存储服务的不同实现方式
/// - 提供自定义文件存储接口
/// 
/// 使用场景：
/// - 需要自定义文件存储逻辑
/// - 需要在租户文件夹中存储文件
/// - 需要扩展文件存储功能
/// 
/// 设计原因：
/// - 利用 Orchard Core 的文件存储抽象
/// - 支持依赖注入和配置
/// - 提供灵活的文件存储实现
/// 
/// 设计模式：
/// - 继承模式：从 FileSystemStore 继承实现
/// - 依赖注入模式：通过构造函数注入配置
/// - 接口模式：通过接口实现解耦
/// </summary>
// 您有多种方式使用 FileSystemStore 服务。这里演示的一种是简单地从 FileSystemStore 继承我们的服务。
// 同时从 IFileStore 继承我们的服务。另一种方式是"装饰" IFileStore，这意味着它将是注入到我们实现中的服务。
// 查找 MediaFileStore.cs 以了解该方式的实现。
[SuppressMessage("StyleCop.CSharp.DocumentationRules", "SA1600:Elements should be documented", Justification = "It's a simple sample.")]
public interface ICustomFileStore : IFileStore
{
    // 如果需要，您可以添加其他方法。
}

/// <summary>
/// 自定义文件存储实现 - 基于文件系统的文件存储服务
/// </summary>
public class CustomFileStore : FileSystemStore, ICustomFileStore
{
    /// <summary>
    /// 初始化自定义文件存储的新实例
    /// </summary>
    /// <param name="fileSystemPath">文件系统路径</param>
    // 由于 FileSystemStore 需要基础路径，我们也需要拥有它。如果您有非常特定的绝对路径，
    // 那么您不需要注入它，但为了演示目的，我们将从 Startup.cs 注入它，因为它将在租户的文件夹中。
    public CustomFileStore(string fileSystemPath)
        : base(fileSystemPath)
    {
    }
}

// 下一站：Startup.cs 并在 ConfigureServices 方法中查找 File System 注释行。
